单例模式

单例就是保证始终只有一个实例。确保对象的唯一性,如Windows的任务管理器,打印控制器,数据库连接池等。实现单例注意点:
(1)构造器私有,外部无法创建实例;
(2)因此需要提供公有的方法来获取实例getInstance();
(3)静态类私有成员变量,保证只有一个变量引用。
单例模式的两种实现形式:

  1. 懒汉式:在第一次获取实例时才创建对象。
    如果在获取实例前线程A暂停了,此时线程B获取实例并创建了对象并返回了,然后线程A恢复,又创建了一个对象,不能保证单例,因此需要为getInstance()方法加上synchronized关键字保证线程同步。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//懒汉模式
public class ConnectionPoolA {
private static ConnectionPoolA cp;
private ConnectionPoolA(){}
public static synchronized ConnectionPoolA getInstance(){
if (cp == null) {
cp = new ConnectionPoolA();
}
return cp;
}
}
```
2. 饿汉式:在类加载时就已经创建对象了。
饿汉式不存在线程安全问题,但容易造成资源浪费,因为实例在类加载的时候随着静态变量的初始化而创建,但有时候可能并不会使用该实例。

//饿汉模式
public class ConnectionPoolB {
private static ConnectionPoolB cp = new ConnectionPoolB();
private ConnectionPoolB() {}
public static ConnectionPoolB getInstance() {
return cp;
}
}

1
2
3
4
5
6
7
8
```
public class SingletonObject {
public static void main(String[] args) {
ConnectionPoolA cp1 = ConnectionPoolA.getInstance();
ConnectionPoolA cp2 = ConnectionPoolA.getInstance();
System.out.println(cp1 == cp2); //判断是否创建的两个相同的对象,true
}
}